前言
今天要分享一個從 .NET Framework 開始,就有的應用 : Model Binding ,相信這主題大家都知道了,但它很常見,也會用到,所以也必須納入這系列之一,也請耐心看完
分享主軸
簡單來說就是將 HTTP 請求資料(如 : 表單數據、路由數據、查詢字符串和標頭 )綁定到對應方法的參數上
用來比對 比對 Query String 上面的值,如果是簡單類型(如 int、string 等),會自動繫結,不需要特別標註 [FromQuery],除了複雜模型 (如自定義類別),就得使用它來指定,如下範例
[HttpGet]
public IActionResult Get(int number)
{
return Ok(number);
}
Request出去的網址如下
https://localhost:7161/WeatherForecast/Get?number=123
TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body
正確使用
[HttpGet]
public IActionResult Get([FromQuery] Pet pet)
{
// pet 會從查詢字符串中繫結
return Ok(pet);
}
Request出去的網址如下
不管有沒有加此屬性,都會正常繫結到(所以如果專案上有寫這屬性,可能要檢查一下是否有多餘的寫法)
[HttpPost]
public IActionResult Post(Pet pet)
{
return Ok(pet);
}
從 HTTP 標頭中提取值並將其繫結到控制器方法的參數上
只會從 HTTP Request 取值
只能套用簡單模型
簡單模型
[HttpGet("header")]
public IActionResult GetHeaderValue([FromHeader(Name = "X-Custom-Header")] string customHeader)
{
return Ok(new { HeaderValue = customHeader });
}
結果
其他屬性如
[FromServices] : 可以在某個 action 用這屬性去注入任何的一個服務
[FromForm]
[FromRoute]
using System.ComponentModel.DataAnnotations;
...
{
public class UserModel
{
[Required(ErrorMessage = "Name is required")]
[StringLength(50, MinimumLength = 2, ErrorMessage = "Name must be between 2 and 50 characters")]
public string Name { get; set; } = null!;
[Required(ErrorMessage = "Email 必填")]
[EmailAddress(ErrorMessage = "Email Address 格式不正確")]
public string Email { get; set; } = null!;
[Required(ErrorMessage = "Age 必填")]
[Range(18, 30, ErrorMessage = "Age 必須介於 18 ~ 30")]
public int Age { get; set; }
[Phone(ErrorMessage = "電話格式不正確")]
public string? PhoneNumber { get; set; }
}
}
範例
今日結語
終於堅持到這系列的 2/3 文章了!!! 特別安排一個比較簡單的主題放在第 20 天
雖然今日主題,一定是大家都耳熟能想的知識了,但它也是專案上常常使用到的,透過這主題再次複習到一些基本觀念!
明天繼續努力,謝謝 ~
參考文章
https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-8.0